package service

import (
	"gitee.com/gopher2011/mall/app/dao"
	"gitee.com/gopher2011/mall/library/util"
	"github.com/pkg/errors"
	"time"
)

// 全局公开对象
var UmsAdmin = umsAdminService{}

// 私有对象，所有的方法都绑定到这个结构体上。
type umsAdminService struct{}

func (p *umsAdminService) Register(u dao.UmsAdmin) (int64, error) {
	res, err := dao.UmsAdminDao.GetAdminByName(u.Username)
	if err != nil {
		return 0, err
	}
	if res.Id > 0 {
		return 0, errors.New("该用户已经注册了")
	}
	u.Password = util.Md5(u.Password)
	u.CreateTime = time.Now()
	res2, err := dao.UmsAdminDao.Insert(u)
	if err != nil {
		return 0, err
	}
	return res2, nil
}

func (p *umsAdminService) Login(u *dao.UmsJWTParma) (ua *dao.UmsAdmin, err error) {
	pass := util.Md5(u.Password)
	// 先到redis缓存中查找该用户
	// redis中没有找到该用户则去数据库中找
	res, err := dao.UmsAdminDao.GetAdminByName(u.Username)
	if err != nil {
		return nil, err
	}
	if res.Id <= 0 {
		return nil, errors.New("请输入正确的用户名")
	}
	// 这里可以这么写，因为Register()接口不可能注册同名用户!
	exist, err := dao.UmsAdminDao.UserExist(u.Username, pass)
	if err != nil {
		return nil, err
	}
	if exist.Id <= 0 {
		return nil, errors.New("请输入正确的密码")
	}
	_, err = dao.UmsAdminDao.UpdateColumn(time.Now()) //更新登陆时间
	if err != nil {
		return &exist, err
	}
	return &exist, nil
}

//根据用户名获取 UmsAdmin对象。
func (p *umsAdminService) GetAdminInfo(username string) (ua dao.UmsAdmin, err error) {
	// 先到redis缓存中查找该用户
	// redis中没有找到该用户则去数据库中找
	// .......
	res, err := dao.UmsAdminDao.GetAdminByName(username)
	if err != nil {
		return ua, err
	}
	return res, nil
}

// 根据用户名或姓名分页获取用户列表 /list Get
func (p *umsAdminService) List(l dao.UmsAdminList) ([]dao.UmsAdmin, error) {
	l.PageNum = (l.PageNum - 1) * l.PageSize
	return dao.UmsAdminDao.List(l)
}

// 获取指定用户信息 /{id} Get
func (p *umsAdminService) GetItem(id int64) (dao.UmsAdmin, error) {
	return dao.UmsAdminDao.SelectByPrimaryKey(id)
}

// 修改指定用户信息
func (p *umsAdminService) Update(id int64, admin dao.UmsAdmin) (int64, error) {
	ua, _ := dao.UmsAdminDao.SelectByPrimaryKey(id)
	pass := util.Md5(admin.Password)
	//与原加密密码相同的不需要修改
	if ua.Password != pass {
		admin.Id = id
		admin.Password = pass
		count, err := dao.UmsAdminDao.UpdateById(admin)
		return count, err
	}
	return 0, errors.New("输入的UmsAdmin对象密码与数据库中原加密密码相同")
}

// 修改帐号状态  /updateStatus/{id}
func (p *umsAdminService) UpdateStatus(id, status int64) (int64, error) {
	return dao.UmsAdminDao.UpdateStatus(id, status)
}

// 给用户分配角色
func (p *umsAdminService) UpdateRole(list dao.UmsAdminUpdateRole) (int64, error) {
	count := len(list.RoleIds)
	//先删除原来的关系
	res, err := dao.UmsAdminRoleRelationDao.DeleteByAdminId(list.AdminId)
	if err != nil {
		return res, err
	}
	//建立新关系
	if count != 0 {
		return dao.UmsAdminRoleRelationDao.InsertList(list)
	} else {
		return 0, err
	}
}

// 修改指定用户密码
func (p *umsAdminService) UpdatePassword(it dao.UpdateAdminPasswordParam) (int64, error) {
	old := util.Md5(it.OldPassword)
	news := util.Md5(it.NewPassword)
	res, err := dao.UmsAdminDao.GetAdminByName(it.Username)
	if err != nil {
		return 0, err
	}
	if res.Id <= 0 {
		return 0, errors.New("请输入正确的用户名!")
	}
	// 输入的密码与数据库中的密码不匹配
	if res.Password != old {
		return 0, errors.New("请输入正确的密码!")
	}
	return dao.UmsAdminDao.UpdatePassword(news, res.Id)
}

// 删除指定用户信息
func (p *umsAdminService) Delete(id int) (int64, error) {
	return dao.UmsAdminDao.DeleteByPrimaryKey(id)
}

func (p *umsAdminService) GetRoleList(adminId int64) ([]dao.UmsRole, error) {
	return dao.UmsAdminRoleRelationDao.GetRoleList(adminId)
}
